package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

// 发送者[客户端]   接收者[服务端]

/**
	1 键盘录入,待传输的文件根路径
	2 判断文件状态值，是否出错
	3 开启tcp端口7777传输通道连接
	4 先发送文件名,确认接收方响应值
	5 当接收方确认OK后，再发送文件资源

**/

func main() {

	fmt.Println(" please input your file path : ")
	var filePath string // D:/201901/111.jpg
	fmt.Scan(&filePath)

	statInfo, statErr := os.Stat(filePath)
	if statErr != nil {
		fmt.Println(" os.Stat err = ", statErr)
		return
	}

	sendConn, sendErr := net.Dial("tcp", "127.0.0.1:7777")
	if sendErr != nil {
		fmt.Println(" net.Dial err = ", sendErr)
	}

	defer sendConn.Close()

	// 先发送文件名称作为接收者本地存储文件名
	writeIndex, writeErr := sendConn.Write([]byte(statInfo.Name()))
	if writeErr != nil {
		fmt.Println(" con.Write err =  ", writeErr)
	}
	fmt.Println(" fileName--length : ", writeIndex)

	// 接收对方回复 , ok==>可以发送文件
	var index int
	buffer := make([]byte, 1024)
	index, err := sendConn.Read(buffer)
	if err != nil {
		fmt.Println(" con.Read err = ", err)
		return
	}

	if "ok" == string(buffer[:index]) {
		sendFile(filePath, sendConn)
	}

}

func sendFile(path string, conn net.Conn) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println(" os.open err = ", err)
	}

	defer f.Close()

	buf := make([]byte, 1024)

	for {
		n, err := f.Read(buf)
		if err != nil {
			if err == io.EOF {
				fmt.Println("发送文件完毕")
			} else {
				fmt.Println(" os.stat err = ", err)
			}
			return
		}
		conn.Write(buf[:n])
	}

}
